﻿using log4net;
using NpgsqlTypes;
using PcaCore.BOL.Pca;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace PcaCore.DAL.Pca
{
    public class dOficina
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(dOficina));

        #region Public

        public static void Insert(oOficina myClass)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_add_oficina(varchar,--empresa_id $1
                //          varchar,--oficina_id $2
                //          varchar,--nombre $3
                //          varchar,--direccion $4
                //          varchar --telefono $5
                //          )RETURNS void   
                Core.ExecuteNonQuery("pca.fn_add_oficina",
                                     new oParametro(NpgsqlDbType.Varchar, myClass.empresa_id),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.oficina_id),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.nombre),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.direccion),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.telefono));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void Update(oOficina myClass)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_update_oficina(varchar,--empresa_id $1
                //         varchar,--oficina_id $2
                //         varchar,--nombre $3
                //         varchar,--direccion $4
                //         varchar,--telefono $5
                //         boolean --activo $6
                //         ) RETURNS void
                Core.ExecuteNonQuery("pca.fn_update_oficina",
                                     new oParametro(NpgsqlDbType.Varchar, myClass.empresa_id), 
                                     new oParametro(NpgsqlDbType.Varchar, myClass.oficina_id),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.nombre),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.direccion),
                                     new oParametro(NpgsqlDbType.Varchar, myClass.telefono),
                                     new oParametro(NpgsqlDbType.Boolean, myClass.activo));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void Delete(string empresaId,
                                  string oficinaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_del_oficina(varchar,--empresa_id $1
                //          varchar --oficina_id $2
                //          )RETURNS void
                Core.ExecuteNonQuery("pca.fn_del_oficina",
                                     new oParametro(NpgsqlDbType.Varchar, empresaId),
                                     new oParametro(NpgsqlDbType.Varchar, oficinaId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static oOficina Get(string empresaId,
                                   string oficinaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_get_oficina(varchar,--empresa_id $1
                //          varchar --oficina_id $2
                //          )RETURNS SETOF pca.oficinas
                return Core.GetObjectDb<oOficina>("pca.fn_get_oficina",
                                                   new oParametro(NpgsqlDbType.Varchar, empresaId),
                                                   new oParametro(NpgsqlDbType.Varchar, oficinaId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oOficina> GetList(string empresaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_get_list_oficina(varchar --empresa_id $1
                //           )RETURNS SETOF pca.oficinas
                return Core.GetListObjecstDb<oOficina>("pca.fn_get_list_oficina",
                                                       new oParametro(NpgsqlDbType.Varchar, empresaId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oOficina> GetList(int start,
                                             int limit,
                                             out int totalRecords,
                                             string empresaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_get_list_oficina(integer,--start $1
                //           integer, --limit $2
                //           varchar --empresa_id $3
                //           )RETURNS SETOF refcursor
                return Core.GetListObjecstDb<oOficina>("pca.fn_get_list_oficina",
                                                       out totalRecords,
                                                       new oParametro(NpgsqlDbType.Integer, start),
                                                       new oParametro(NpgsqlDbType.Integer, limit),
                                                       new oParametro(NpgsqlDbType.Varchar, empresaId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oOficina> GetList(int start,
                                             int limit,
                                             out int totalRecords,
                                             string empresaId,
                                             string query)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca.fn_get_list_oficina(integer,--start $1
                //           integer, --limit $2
                //           varchar,--empresa_id $3
                //           varchar --query $4
                //           )RETURNS SETOF refcursor
                return Core.GetListObjecstDb<oOficina>("pca.fn_get_list_oficina",
                                                       out totalRecords,
                                                       new oParametro(NpgsqlDbType.Integer, start),
                                                       new oParametro(NpgsqlDbType.Integer, limit),
                                                       new oParametro(NpgsqlDbType.Varchar, empresaId),
                                                       new oParametro(NpgsqlDbType.Varchar, query));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        #endregion
    }
}
